{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Convert and Optimize RT-DETR  real-time object detection with OpenVINO™"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Real-time object detection is often used as a key component in computer vision systems. Applications that use real-time object detection models include video analytics, robotics, autonomous vehicles, multi-object tracking and object counting, medical image analysis, and many others.\n",
    "\n",
    "This tutorial demonstrates step-by-step instructions on how to run and optimize RT-DETR with OpenVINO. We consider the steps required for object detection scenario."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Install the Operating Environment\n",
    "In order to make it easier for everyone to reproduce the project, we first set up the project running environment, mainly including the PaddlePaddle model acquisition environment and the OpenVINO model optimization environment."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Install PaddlePaddle Environment\n",
    "The RT-DETR model is trained under the PaddlePaddle framework, so in order to export the model in the future, we need to install the PaddlePaddle environment. Here, only the CPU environment needs to be installed, and there is no need to install the GPU environment.\n",
    "- Install PaddlePaddle"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "!python -m pip install paddlepaddle>=2.4.1 -i https://pypi.tuna.tsinghua.edu.cn/simple"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- Install PaddleDetection"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Clone PaddleDetection repository\n",
    "!git clone https://github.com/PaddlePaddle/PaddleDetection.git"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Install other dependencies\n",
    "%cd PaddleDetection\n",
    "!git checkout develop\n",
    "%pip install -r requirements.txt\n",
    "# Compile and install paddledet\n",
    "!python setup.py install"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- Install PaddleDetection"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%pip install onnx==1.13.0\n",
    "%pip install paddle2onnx==1.0.5"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Install OpenVINO Environment"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%pip install -q \"openvino>=2023.1.0\" \"nncf>=2.5.0\""
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Install ultralytics Environment\n",
    "The RT-DETR model is trained based on the COCO dataset, so here we use the Ultratics toolkit for dataset processing."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%pip install ultralytics"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Download the notebook_utils\n",
    "Download to \".\\optimize\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "('notebook_utils.py', <http.client.HTTPMessage at 0x25809ee0070>)"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# If the current file path is not in the specified folder, please switch to the specified folder.\n",
    "# %cd .. \n",
    "\n",
    "from pathlib import Path\n",
    "# Fetch the notebook utils script from the openvino_notebooks repo\n",
    "import urllib.request\n",
    "urllib.request.urlretrieve(\n",
    "    url='https://raw.githubusercontent.com/openvinotoolkit/openvino_notebooks/main/notebooks/utils/notebook_utils.py',\n",
    "    filename='notebook_utils.py'\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%pip install ipywidgets"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Load All Environments"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "INFO:nncf:NNCF initialized successfully. Supported frameworks detected: torch, onnx, openvino\n"
     ]
    }
   ],
   "source": [
    "import os\n",
    "\n",
    "import torch\n",
    "\n",
    "import openvino as ov\n",
    "import nncf  # noqa: F811\n",
    "from openvino.runtime import serialize\n",
    "\n",
    "import ipywidgets as widgets\n",
    "from zipfile import ZipFile\n",
    "from tqdm.notebook import tqdm\n",
    "\n",
    "from typing import Tuple\n",
    "\n",
    "import numpy as np\n",
    "from typing import Dict\n",
    "\n",
    "\n",
    "import cv2 as cv\n",
    "import PIL\n",
    "from PIL import ImageDraw, Image\n",
    "\n",
    "from ultralytics.utils import DEFAULT_CFG\n",
    "from ultralytics.cfg import get_cfg\n",
    "from ultralytics.data.utils import check_det_dataset\n",
    "from ultralytics import YOLO\n",
    "from ultralytics.models.yolo.detect import DetectionValidator\n",
    "from ultralytics.data import converter\n",
    "from ultralytics.utils.metrics import ConfusionMatrix\n",
    "\n",
    "from notebook_utils import download_file, VideoPlayer"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Download RT-DETR model\n",
    "- Select the Model\n",
    "\n",
    "    First, select the model you want to download."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "MODEL_NAME = widgets.Dropdown(\n",
    "    options= [\"rtdetr_r101vd_6x\"]+[\"rtdetr_r50vd_m_6x\"]+[\"rtdetr_r50vd_6x\"]+[\"rtdetr_r34vd_6x\"]+[\"rtdetr_r18vd_6x\"],\n",
    "    value='rtdetr_r50vd_6x',\n",
    "    description='Model name:',\n",
    "    disabled=False,\n",
    ")\n",
    "MODEL_NAME"
   ]
  },
  {
   "attachments": {
    "image-2.png": {
     "image/png": "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"
    },
    "image.png": {
     "image/png": "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"
    }
   },
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- Download Paddlepaddle Model\n",
    "\n",
    "    If the PaddlePaddle installed is a CPU version, it is necessary to modify the \"runtime.yml\" file in the \".\\optimize\\PaddleDetection\\configs\" path, as shown in the following figure: \n",
    "    \n",
    "    ![image.png](attachment:image.png)\n",
    "\n",
    "    The default exported model is a multi input model with post-processing. We need to export a single input model, so we need to modify the \"rtdetr_r50vd.yml\" file under the \".\\optimize\\PaddleDetection\\configs\\rtdetr\\\\\\_base_\" path, as shown in the following figure:\n",
    "\n",
    "    ![image-2.png](attachment:image-2.png)\n",
    "\n",
    "    Then enter the following command to export the PaddlePaddle model."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "select_model=MODEL_NAME.value+\"_coco\"\n",
    "config=f\"PaddleDetection/configs/rtdetr/{MODEL_NAME.value}_coco.yml\"\n",
    "if select_model=='rtdetr_r34vd_6x_coco':\n",
    "    url=f\"https://bj.bcebos.com/v1/paddledet/models/rtdetr_r34vd_dec4_6x_coco.pdparams\"\n",
    "elif select_model=='rtdetr_r18vd_6x_coco':\n",
    "    url=f\"https://bj.bcebos.com/v1/paddledet/models/rtdetr_r18vd_dec3_6x_coco.pdparams\"\n",
    "else :\n",
    "    url=f\"https://bj.bcebos.com/v1/paddledet/models/{select_model}.pdparams\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "!python PaddleDetection/tools/export_model.py -c {config} -o weights={url} trt=True --output_dir=PaddleDetection/output_inference"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- Convert model to ONNX\n",
    "\n",
    "We need to convert the model to IR format. The traditional approach is to first convert the PaddlePaddle model to ONNX format, and then convert the model to IR format; Of course, the latest version of OpenVINO supports direct conversion of PaddlPallde, and we can skip this step and proceed directly to the next step.\n",
    "I use the traditional process here: PaddlePaddle ->ONNX ->IR"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "model_dir=f\"./PaddleDetection/output_inference/{select_model}/\"\n",
    "save_file=f\"./models/{select_model}.onnx\"\n",
    "!paddle2onnx --model_dir={model_dir} --model_filename model.pdmodel --params_filename model.pdiparams --opset_version 16 --save_file {save_file}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- Convert model to OpenVINO IR\n",
    "\n",
    "The IR model conversion can be achieved through Python code, and one can be achieved through commands. Here, we use commands for conversion:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "onnx_model_path=save_file\n",
    "output_model=f\"./models/{select_model}\"\n",
    "!ovc {onnx_model_path} --output_model {output_model}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Test Original Model Inference\n",
    "\n",
    "### Model Data Process\n",
    "Define the RT-DETR model data processing method."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "def print_info(msg):\n",
    "    print(\"[INFO]  %s\"%msg,end=\"\\n\")\n",
    "    \n",
    "# The `RtdetrProcess` class is a Python class that provides methods for preprocessing and\n",
    "# postprocessing images for the RT-DETR object detection model.\n",
    "class RtdetrProcess(object):\n",
    "    def __init__(self, target_size, label_path=None, threshold=0.5, interp=cv.INTER_LINEAR):\n",
    "        self.im_info = dict()\n",
    "        self.target_size =target_size\n",
    "        self.interp = interp\n",
    "        self.threshold = threshold\n",
    "        if label_path is None:\n",
    "            self.labels = []\n",
    "            self.flabel = False\n",
    "        else:\n",
    "            self.labels = self.read_lable(label_path=label_path)\n",
    "            self.flabel = True\n",
    "\n",
    "    def read_lable(self,label_path):\n",
    "        lable = [] \n",
    "        f = open(label_path)\n",
    "        line = f.readline()\n",
    "        while line:\n",
    "            lable.append(line.replace('\\n',''))\n",
    "            line = f.readline()\n",
    "        f.close()\n",
    "        return lable\n",
    "    def preprocess(self,im):\n",
    "        assert len(self.target_size) == 2\n",
    "        assert self.target_size[0] > 0 and self.target_size[1] > 0\n",
    "        origin_shape = im.shape[:2]\n",
    "        resize_h, resize_w = self.target_size\n",
    "        im_scale_y = resize_h / float(origin_shape[0])\n",
    "        im_scale_x = resize_w / float(origin_shape[1])\n",
    "        out_im = cv.cvtColor(im,cv.COLOR_BGR2RGB)\n",
    "        out_im = cv.resize(\n",
    "            out_im.astype('float32'),\n",
    "            None,\n",
    "            None,\n",
    "            fx=im_scale_x,\n",
    "            fy=im_scale_y,\n",
    "            interpolation=self.interp)\n",
    "        self.im_info['im_shape'] = np.array(im.shape[:2]).astype('float32')\n",
    "        self.im_info['scale_factor'] = np.array([im_scale_y, im_scale_x]).astype('float32')\n",
    "        scale = 1.0 / 255.0\n",
    "        out_im *= scale\n",
    "        out_im = out_im.transpose((2, 0, 1)).copy()\n",
    "\n",
    "        return  np.expand_dims(out_im.astype('float32'),0), self.im_info\n",
    "    \n",
    "    def sigmoid(self,z):\n",
    "        fz = []\n",
    "        for num in z:\n",
    "            fz.append(1/(1+np.exp(-num)))\n",
    "        return np.array(fz)\n",
    "    def postprocess(self,scores,bboxs=None):\n",
    "        results = []\n",
    "        if bboxs is None:\n",
    "            scores = np.array(scores).astype('float32')\n",
    "            for l in scores:\n",
    "                if(l[1]>=self.threshold):\n",
    "                    re = dict()\n",
    "                    re[\"clsid\"]=int(l[0])\n",
    "                    if(self.flabel):\n",
    "                        re[\"label\"]=self.labels[int(l[0])]\n",
    "                    else:\n",
    "                        re[\"label\"]=int(l[0])\n",
    "                    re[\"score\"]=l[1]\n",
    "                    bbox=[l[2],l[3],l[4],l[5]]\n",
    "                    re[\"bbox\"]=bbox\n",
    "                    results.append(re)\n",
    "        else:\n",
    "            scores = np.array(scores).astype('float32')\n",
    "            bboxs = np.array(bboxs).astype('float32')\n",
    "            for s,b in zip(scores,bboxs):\n",
    "                s = self.sigmoid(s)\n",
    "                if(np.max(np.array(s)>=self.threshold)):\n",
    "                    ids = np.argmax(np.array(s))\n",
    "                    re = dict()\n",
    "                    re[\"clsid\"]=int(ids)\n",
    "                    if(self.flabel):\n",
    "                        re[\"label\"]=self.labels[int(ids)]\n",
    "                    else:\n",
    "                        re[\"label\"]=int(ids)\n",
    "                    re[\"score\"]=s[ids]\n",
    "                    cx=(b[0]*640.0)/self.im_info[\"scale_factor\"][1]\n",
    "                    cy=(b[1]*640.0)/self.im_info[\"scale_factor\"][0]\n",
    "                    w=(b[2]*640.0)/self.im_info[\"scale_factor\"][1]\n",
    "                    h=(b[3]*640.0)/self.im_info[\"scale_factor\"][0]\n",
    "\n",
    "                    bbox=[cx-w/2.0,\n",
    "                          cy-h/2.0,\n",
    "                          cx+w/2.0,\n",
    "                          cy+h/2.0]\n",
    "                    re[\"bbox\"]=bbox\n",
    "                    results.append(re)\n",
    "        return results\n",
    "    def get_color_map_list(self, num_classes):\n",
    "        color_map = num_classes * [0, 0, 0]\n",
    "        for i in range(0, num_classes):\n",
    "            j = 0\n",
    "            lab = i\n",
    "            while lab:\n",
    "                color_map[i * 3] |= (((lab >> 0) & 1) << (7 - j))\n",
    "                color_map[i * 3 + 1] |= (((lab >> 1) & 1) << (7 - j))\n",
    "                color_map[i * 3 + 2] |= (((lab >> 2) & 1) << (7 - j))\n",
    "                j += 1\n",
    "                lab >>= 3\n",
    "        color_map = [color_map[i:i + 3] for i in range(0, len(color_map), 3)]\n",
    "        return color_map\n",
    "    def imagedraw_textsize_c(self, draw, text):\n",
    "        \"\"\"\n",
    "        The function `imagedraw_textsize_c` calculates the width and height of a given text when drawn on an\n",
    "        image using the `draw` object.\n",
    "        \n",
    "        Args:\n",
    "          draw: The \"draw\" parameter is an instance of the `ImageDraw` class from the PIL library. It is\n",
    "        used to draw on an image.\n",
    "          text: The \"text\" parameter is the string of text that you want to measure the size of.\n",
    "        \n",
    "        Returns:\n",
    "          the width (tw) and height (th) of the text when it is drawn on an image.\n",
    "        \"\"\"\n",
    "        if int(PIL.__version__.split('.')[0]) < 10:\n",
    "            tw, th = draw.textsize(text)\n",
    "        else:\n",
    "            left, top, right, bottom = draw.textbbox((0, 0), text)\n",
    "            tw, th = right - left, bottom - top\n",
    "\n",
    "        return tw, th\n",
    "    def draw_box(self, im, results):\n",
    "        draw_thickness = 2\n",
    "        im = Image.fromarray(im)\n",
    "        draw = ImageDraw.Draw(im)\n",
    "        clsid2color = {}\n",
    "        color_list = self.get_color_map_list(80)\n",
    "        for re in results:\n",
    "            clsid =  re[\"clsid\"]\n",
    "            label = re[\"label\"]\n",
    "            bbox = re[\"bbox\"]\n",
    "            score = re[\"score\"]\n",
    "            if clsid not in clsid2color:\n",
    "                clsid2color[clsid] = color_list[clsid]\n",
    "            color = tuple(clsid2color[clsid])\n",
    "\n",
    "            if len(bbox) == 4:\n",
    "                xmin, ymin, xmax, ymax = bbox\n",
    "                print_info('class_id:{:d}, label:{:s}, confidence:{:.4f}, left_top:[{:.2f},{:.2f}],'\n",
    "                    'right_bottom:[{:.2f},{:.2f}]'.format(\n",
    "                        int(clsid), label, score, xmin, ymin, xmax, ymax))\n",
    "                # draw bbox\n",
    "                draw.line(\n",
    "                    [(xmin, ymin), (xmin, ymax), (xmax, ymax), (xmax, ymin),\n",
    "                    (xmin, ymin)],\n",
    "                    width=draw_thickness,\n",
    "                    fill=color)\n",
    "            elif len(bbox) == 8:\n",
    "                x1, y1, x2, y2, x3, y3, x4, y4 = bbox\n",
    "                draw.line(\n",
    "                    [(x1, y1), (x2, y2), (x3, y3), (x4, y4), (x1, y1)],\n",
    "                    width=2,\n",
    "                    fill=color)\n",
    "                xmin = min(x1, x2, x3, x4)\n",
    "                ymin = min(y1, y2, y3, y4)\n",
    "\n",
    "            # draw label\n",
    "            text = \"{} {:.4f}\".format(label, score)\n",
    "            tw, th = self.imagedraw_textsize_c(draw, text)\n",
    "            draw.rectangle(\n",
    "                [(xmin + 1, ymin - th), (xmin + tw + 1, ymin)], fill=color)\n",
    "            draw.text((xmin + 1, ymin - th), text, fill=(255, 255, 255))\n",
    "        return np.array(im)\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Model Inference Process\n",
    "Define the RT-DETR model inference process to achieve model inference and result processing."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "def rtdert_infer(model:ov.Model, core:ov.Core, image_path, device_name, lable_path):\n",
    "    '''-------------------1. Initialize and Read Model ----------------------'''\n",
    "    print_info(\"Device name: \" + device_name)\n",
    "    \n",
    "    compiled_model = core.compile_model(model=model, device_name=device_name)\n",
    "\n",
    "    '''-------------------2. Preprocessing model input data ----------------------'''\n",
    "    print_info(\"The input path: \" + image_path)\n",
    "    image = cv.imread(image_path)\n",
    "    rtdetr_process = RtdetrProcess([640,640],lable_path)\n",
    "    im, im_info= rtdetr_process.preprocess(image)\n",
    "    inputs = dict()\n",
    "    inputs[\"image\"] = np.array(im).astype('float32')\n",
    "    \n",
    "    '''-------------------3. Infer ----------------------'''\n",
    "    results = compiled_model(inputs=inputs)\n",
    "    '''-------------------5. Post processing prediction results ----------------------'''\n",
    "\n",
    "    \n",
    "    re=rtdetr_process.postprocess(results[compiled_model.output(1)][0],results[compiled_model.output(0)][0])\n",
    "    new_image=rtdetr_process.draw_box(image,re)\n",
    "    return new_image\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Implement Model Inference"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "core = ov.Core()\n",
    "rtdetr_model = core.read_model(f'./models/{select_model}.xml')\n",
    "image=rtdert_infer(rtdetr_model, core, \"./../image/000000570688.jpg\", \"CPU\",\"./../image/COCO_lable.txt\")\n",
    "Image.fromarray(cv.cvtColor(image,cv.COLOR_BGR2RGB))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Preparing the Validate Dataset\n",
    "\n",
    "### Download the Validation COCO Dataset\n",
    "RT-DETR is pre-trained on the COCO dataset, so to evaluate the model accuracy we need to download it. According to the instructions provided in the RT-DETR repo, we also need to download annotations in the format used by the author of the model, for use with the original model evaluation function.\n",
    "\n",
    "> Note: The initial dataset download may take a few minutes to complete. The download speed will vary depending on the quality of your internet connection."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "from zipfile import ZipFile\n",
    "\n",
    "DATA_URL = \"http://images.cocodataset.org/zips/val2017.zip\"\n",
    "LABELS_URL = \"https://github.com/ultralytics/yolov5/releases/download/v1.0/coco2017labels-segments.zip\"\n",
    "CFG_URL = \"https://raw.githubusercontent.com/ultralytics/ultralytics/8ebe94d1e928687feaa1fee6d5668987df5e43be/ultralytics/datasets/coco.yaml\"\n",
    "\n",
    "OUT_DIR = Path('E:/GitSpace/RT-DETR-OpenVINO/optimize/datasets')\n",
    "\n",
    "DATA_PATH = OUT_DIR / \"val2017.zip\"\n",
    "LABELS_PATH = OUT_DIR / \"coco2017labels-segments.zip\"\n",
    "CFG_PATH = OUT_DIR / \"coco.yaml\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "download_file(DATA_URL, DATA_PATH.name, DATA_PATH.parent)\n",
    "download_file(LABELS_URL, LABELS_PATH.name, LABELS_PATH.parent)\n",
    "download_file(CFG_URL, CFG_PATH.name, CFG_PATH.parent)\n",
    "\n",
    "if not (OUT_DIR / \"coco/labels\").exists():\n",
    "    with ZipFile(LABELS_PATH , \"r\") as zip_ref:\n",
    "        zip_ref.extractall(OUT_DIR)\n",
    "    with ZipFile(DATA_PATH , \"r\") as zip_ref:\n",
    "        zip_ref.extractall(OUT_DIR / 'coco/images')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Configure Validator helper and create DataLoader\n",
    "\n",
    "The Yolov8 model repository uses a Validator wrapper, which represents the accuracy validation pipeline. It creates dataloader and evaluation metrics and updates metrics on each data batch produced by the dataloader. Besides that, it is responsible for data preprocessing and results postprocessing. \n",
    "The RT-DETR model training set also uses the COCO dataset. For convenience, we use the Yolov8 environment to configure the data here.\n",
    "For class initialization, the configuration should be provided. We will use the default setup, but it can be replaced with some parameters overriding to test on custom data. The model has connected the ValidatorClass method, which creates a validator class instance."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "args = get_cfg(cfg=DEFAULT_CFG)\n",
    "args.data = str(CFG_PATH)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "YOLO_MODEL = \"yolov8n\"\n",
    "models_dir = Path('./models')\n",
    "yolo_model = YOLO(models_dir / f'{YOLO_MODEL}.pt')\n",
    "det_validator = DetectionValidator(args=args)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\u001b[34m\u001b[1mval: \u001b[0mScanning E:\\GitSpace\\RT-DETR-OpenVINO\\optimize\\datasets\\coco\\labels\\val2017.cache... 4952 images, 48 backgrounds, 0 corrupt: 100%|██████████| 5000/5000 [00:00<?, ?it/s]\n"
     ]
    }
   ],
   "source": [
    "det_data_loader = det_validator.get_dataloader(\"E:\\GitSpace\\RT-DETR-OpenVINO\\optimize\\datasets\\coco\", 1)\n",
    "det_validator.is_coco = True\n",
    "det_validator.class_map = converter.coco80_to_coco91_class()\n",
    "det_validator.names = yolo_model.names\n",
    "det_validator.metrics.names = det_validator.names\n",
    "det_validator.nc = yolo_model.model.model[-1].nc"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Check Model Accuracy on the Dataset\n",
    "\n",
    "For comparing the optimized model result with the original, it is good to know some measurable results in terms of model accuracy on the validation dataset."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Define validation function"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "def sigmoid(z):\n",
    "    return 1/(1+np.exp(-z))\n",
    "\n",
    "def rtdetr_result(preds_box,preds_score):\n",
    "    results=[]\n",
    "    n=0\n",
    "    for i in range(300):\n",
    "        scores=preds_score[0,i,:]\n",
    "        score=sigmoid(np.max(np.array(scores)))\n",
    "        if(score<0.0001):\n",
    "            continue\n",
    "        result=[]\n",
    "        cx=preds_box[0,i,0]*640.0\n",
    "        cy=preds_box[0,i,1]*640.0\n",
    "        w=preds_box[0,i,2]*640.0\n",
    "        h=preds_box[0,i,3]*640.0\n",
    "        result.append(cx-0.5*w)\n",
    "        result.append(cy-0.5*h)\n",
    "        result.append(cx+0.5*w)\n",
    "        result.append(cy+0.5*h)\n",
    "        result.append(score)\n",
    "        result.append(np.argmax(scores))\n",
    "        results.append(result)\n",
    "        n+=1\n",
    "    # _, indices = torch.sort(torch.tensor(results), descending=True, dim=0)\n",
    "    # re=[]\n",
    "    # for i in range(n):\n",
    "    #     re.append(results[indices[:,4][i]])\n",
    "    return [torch.tensor(results)]\n",
    "\n",
    "def test(model:ov.Model, core:ov.Core, data_loader:torch.utils.data.DataLoader, validator, num_samples:int = None):\n",
    "    \"\"\"\n",
    "    OpenVINO RT-DETR model accuracy validation function. Runs model validation on dataset and returns metrics\n",
    "    Parameters:\n",
    "        model (Model): OpenVINO model\n",
    "        data_loader (torch.utils.data.DataLoader): dataset loader\n",
    "        validator: instance of validator class\n",
    "        num_samples (int, *optional*, None): validate model only on specified number samples, if provided\n",
    "    Returns:\n",
    "        stats: (Dict[str, float]) - dictionary with aggregated accuracy metrics statistics, key is metric name, value is metric value\n",
    "    \"\"\"\n",
    "    validator.seen = 0\n",
    "    validator.jdict = []\n",
    "    validator.stats = []\n",
    "    validator.batch_i = 1\n",
    "    validator.confusion_matrix = ConfusionMatrix(nc=validator.nc)\n",
    "    compiled_model = core.compile_model(model)\n",
    "    for batch_i, batch in enumerate(tqdm(data_loader, total=num_samples)):\n",
    "        if num_samples is not None and batch_i == num_samples:\n",
    "            break\n",
    "        batch = validator.preprocess(batch)\n",
    "        results = compiled_model(batch[\"img\"])\n",
    "        preds_box = torch.from_numpy(results[compiled_model.output(0)])\n",
    "        preds_score = torch.from_numpy(results[compiled_model.output(1)])\n",
    "        \n",
    "        preds=rtdetr_result(preds_box,preds_score)\n",
    "        # print(batch)\n",
    "        # print(preds[0])\n",
    "        validator.update_metrics(preds, batch)\n",
    "    stats = validator.get_stats()\n",
    "    return stats\n",
    "\n",
    "def print_stats(stats:np.ndarray, total_images:int, total_objects:int):\n",
    "    \"\"\"\n",
    "    Helper function for printing accuracy statistic\n",
    "    Parameters:\n",
    "        stats: (Dict[str, float]) - dictionary with aggregated accuracy metrics statistics, key is metric name, value is metric value\n",
    "        total_images (int) -  number of evaluated images\n",
    "        total objects (int)\n",
    "    Returns:\n",
    "        None\n",
    "    \"\"\"\n",
    "    print(\"Boxes:\")\n",
    "    mp, mr, map50, mean_ap = stats['metrics/precision(B)'], stats['metrics/recall(B)'], stats['metrics/mAP50(B)'], stats['metrics/mAP50-95(B)']\n",
    "    # Print results\n",
    "    s = ('%20s' + '%12s' * 6) % ('Class', 'Images', 'Labels', 'Precision', 'Recall', 'mAP@.5', 'mAP@.5:.95')\n",
    "    print(s)\n",
    "    pf = '%20s' + '%12i' * 2 + '%12.3g' * 4  # print format\n",
    "    print(pf % ('all', total_images, total_objects, mp, mr, map50, mean_ap))\n",
    "    if 'metrics/precision(M)' in stats:\n",
    "        s_mp, s_mr, s_map50, s_mean_ap = stats['metrics/precision(M)'], stats['metrics/recall(M)'], stats['metrics/mAP50(M)'], stats['metrics/mAP50-95(M)']\n",
    "        # Print results\n",
    "        s = ('%20s' + '%12s' * 6) % ('Class', 'Images', 'Labels', 'Precision', 'Recall', 'mAP@.5', 'mAP@.5:.95')\n",
    "        print(s)\n",
    "        pf = '%20s' + '%12i' * 2 + '%12.3g' * 4  # print format\n",
    "        print(pf % ('all', total_images, total_objects, s_mp, s_mr, s_map50, s_mean_ap))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Select inference device\n",
    "\n",
    "Select device from dropdown list for running inference using OpenVINO"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "core = ov.Core()\n",
    "\n",
    "device = widgets.Dropdown(\n",
    "    options=core.available_devices + [\"AUTO\"],\n",
    "    value='AUTO',\n",
    "    description='Device:',\n",
    "    disabled=False,\n",
    ")\n",
    "\n",
    "device"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Read Inference Model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "det_model_path=f'./models/{MODEL_NAME.value}_coco.xml'\n",
    "det_ov_model = core.read_model(det_model_path)\n",
    "if device.value != \"CPU\":\n",
    "    det_ov_model.reshape({0: [1, 3, 640, 640]})"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Getting Accuracy Metrics\n",
    "\n",
    "After definition test function and validator creation, we are ready for getting accuracy metrics\n",
    "\n",
    "> Note: Model evaluation is time consuming process and can take several minutes, depending on the hardware. For reducing calculation time, we define num_samples parameter with evaluation subset size, but in this case, accuracy can be noncomparable with originally reported by the authors of the model, due to validation subset difference.\n",
    "\n",
    "To validate the models on the full dataset set NUM_TEST_SAMPLES = None."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [],
   "source": [
    "NUM_TEST_SAMPLES = 300"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "fp_det_stats = test(det_ov_model, core, det_data_loader, det_validator, num_samples=NUM_TEST_SAMPLES)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Boxes:\n",
      "               Class      Images      Labels   Precision      Recall      mAP@.5  mAP@.5:.95\n",
      "                 all          50         362       0.645       0.551         0.6       0.483\n"
     ]
    }
   ],
   "source": [
    "print_stats(fp_det_stats, det_validator.seen, det_validator.nt_per_class.sum())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "print_stats reports the following list of accuracy metrics:\n",
    "\n",
    "- **Precision** is the degree of exactness of the model in identifying only relevant objects.\n",
    "- **Recall** measures the ability of the model to detect all ground truths objects.\n",
    "- **mAP@t** - mean average precision, represented as area under the Precision-Recall curve aggregated over all classes in the dataset, where t is the Intersection Over Union (IOU) threshold, degree of overlapping between ground truth and predicted objects. Therefore, **mAP@.5** indicates that mean average precision is calculated at 0.5 IOU threshold, **mAP@.5:.95** - is calculated on range IOU thresholds from 0.5 to 0.95 with step 0.05."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Optimize model using NNCF Post-training Quantization API\n",
    "\n",
    "NNCF provides a suite of advanced algorithms for Neural Networks inference optimization in OpenVINO with minimal accuracy drop. We will use 8-bit quantization in post-training mode (without the fine-tuning pipeline) to optimize RT-DETR.\n",
    "\n",
    "The optimization process contains the following steps:\n",
    "\n",
    "Create a Dataset for quantization.\n",
    "Run nncf.quantize for getting an optimized model.\n",
    "Serialize OpenVINO IR model, using the openvino.runtime.serialize function.\n",
    "Reuse validation dataloader in accuracy testing for quantization. For that, it should be wrapped into the nncf.Dataset object and define a transformation function for getting only input tensors."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [],
   "source": [
    "import nncf  # noqa: F811\n",
    "from typing import Dict\n",
    "\n",
    "\n",
    "def transform_fn(data_item:Dict):\n",
    "    \"\"\"\n",
    "    Quantization transform function. Extracts and preprocess input data from dataloader item for quantization.\n",
    "    Parameters:\n",
    "       data_item: Dict with data item produced by DataLoader during iteration\n",
    "    Returns:\n",
    "        input_tensor: Input data for quantization\n",
    "    \"\"\"\n",
    "    input_tensor = det_validator.preprocess(data_item)['img'].numpy()\n",
    "    return input_tensor\n",
    "\n",
    "\n",
    "quantization_dataset = nncf.Dataset(det_data_loader, transform_fn)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The nncf.quantize function provides an interface for model quantization. It requires an instance of the OpenVINO Model and quantization dataset. Optionally, some additional parameters for the configuration quantization process (number of samples for quantization, preset, ignored scope, etc.) can be provided.\n",
    "\n",
    "> Note: Model post-training quantization is time-consuming process. Be patient, it can take several minutes depending on your hardware."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Statistics collection: 100%|██████████| 300/300 [02:48<00:00,  1.78it/s]\n",
      "Applying Fast Bias correction: 100%|██████████| 114/114 [00:26<00:00,  4.25it/s]\n"
     ]
    }
   ],
   "source": [
    "# Detection model\n",
    "quantized_det_model = nncf.quantize(\n",
    "    det_ov_model,\n",
    "    quantization_dataset,\n",
    "    preset=nncf.QuantizationPreset.MIXED\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Quantized detection model will be saved to models\\rtdetr_openvino_int8_model\\rtdetr_r18vd_6x_coco.xml\n"
     ]
    }
   ],
   "source": [
    "int8_model_det_path = models_dir / f'rtdetr_openvino_int8_model/{select_model}.xml'\n",
    "print(f\"Quantized detection model will be saved to {int8_model_det_path}\")\n",
    "serialize(quantized_det_model, str(int8_model_det_path))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Validate Quantized model inference\n",
    "nncf.quantize returns the OpenVINO Model class instance, which is suitable for loading on a device for making predictions. INT8 model input data and output result formats have no difference from the floating point model representation. Therefore, we can reuse the same detect function defined above for getting the INT8 model result on the image."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "image=rtdert_infer(quantized_det_model, core, \"./../image/000000570688.jpg\", \"CPU\",\"./../image/COCO_lable.txt\")\n",
    "Image.fromarray(cv.cvtColor(image,cv.COLOR_BGR2RGB))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Compare the Original and Quantized Models\n",
    "\n",
    "### Compare performance object detection models\n",
    "\n",
    "Finally, use the OpenVINO Benchmark Tool to measure the inference performance of the FP32 and INT8 models.\n",
    "\n",
    "Note: For more accurate performance, it is recommended to run benchmark_app in a terminal/command prompt after closing other applications. Run benchmark_app -m <model_path> -d CPU -shape \"<input_shape>\" to benchmark async inference on CPU on specific input data shape for one minute. Change CPU to GPU to benchmark on GPU. Run benchmark_app --help to see an overview of all command-line options."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "device"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Inference FP32 model (OpenVINO IR)\n",
    "!benchmark_app -m {det_model_path} -d {device.value} -api async -shape \"[1,3,640,640]\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Inference INT8 model (OpenVINO IR)\n",
    "!benchmark_app -m {int8_model_det_path} -d {device.value} -api async -shape \"[1,3,640,640]\" -t 15"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Validate quantized model accuracy\n",
    "As we can see, there is no significant difference between INT8 and float model result in a single image test. To understand how quantization influences model prediction precision, we can compare model accuracy on a dataset."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "int8_det_stats = test(quantized_det_model, core, det_data_loader, det_validator, num_samples=NUM_TEST_SAMPLES)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "print(\"FP32 model accuracy\")\n",
    "print_stats(fp_det_stats, det_validator.seen, det_validator.nt_per_class.sum())\n",
    "\n",
    "print(\"INT8 model accuracy\")\n",
    "print_stats(int8_det_stats, det_validator.seen, det_validator.nt_per_class.sum())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The accuracy of the model prediction has changed, but the change is small and meets the quantitative standards."
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "newRTDETR",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.13"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
